1. 伪共享问题(false sharing)
对于解释伪共享问题,就需要了解一下缓存行的相关概念.缓存行是主存复制到高速缓存的最小单位,一般情况下缓存行的大小为32~128字节(通常为64字节).
在多线程程序执行的过程中,有可能将2个或多个需要频繁修改的变量存储在同一个缓存行当中.这样以来,会频繁的造成缓存头失效的问题.如下图所示:
从编码的角度,为了解决上面的问题,可以使用额外字段来填充缓存行数据.从而达到不同变量之间占用不用的缓存行,增加缓存的命中率.优化后如下图所示:
2. 示例
1 | public class Test implements Runnable { |
1 | # 有填充代码 |